#ifndef NTK_VS_H
#include "ntk_vs.h"
#endif
#ifndef STDIO_H
#include <stdio.h>
#endif
#ifndef DATASTRUCTUREN_H
#include "DataStructuren.h"
#endif
#ifndef SENSOREN_H
#include "Sensoren.h"
#endif
#ifndef BIJSTELLEN_H
#include "Bijstellen.h"
#endif
#ifndef HOOFD_H
#include "Hoofd.h"
#endif

event *quit;
STD *cruiseSTD;
mailBox SensorInput;
int ingesteldeSnelheid;
cruiseStatus status;

void SnelheidsBewerking(int s){

}

void defaultActie(void* s)
{
	//doe iets
}

void action0(void* s)
{
	int snelheid = (int)s;
	ingesteldeSnelheid = snelheid;
}

void action1(void* s)
{
	ingesteldeSnelheid = NULL;
}

void action2(void* s)
{
	ingesteldeSnelheid = NULL;
}

void action3(void* s)
{
	int snel = (int) s;
	SnelheidsBewerking(snel);
}

void action4(void* s)
{
	//doet niets
}

void action5(void* s)
{
	int snel = (int)s;
	ingesteldeSnelheid += 5;
	SnelheidsBewerking(snel);
}

void action6(void* s)
{
	int snel = (int)s;
	ingesteldeSnelheid -= 5;
	SnelheidsBewerking(snel);
}

void action7(void* s)
{
	int snel = (int)s;
	SnelheidsBewerking(snel);
}

void STDinit()
{
	if(cruiseSTD==NULL)
	{
		//Reserveer geheugen
		cruiseSTD=(STD*)malloc(sizeof(STD));
		//maak STD
		create_STD(cruiseSTD,3,defaultActie);
		//Alle mogelijke overgangen toevoegen
		addTransition_STD(cruiseSTD, inactief, activatieknopIndrukken, actief, action0);
		addTransition_STD(cruiseSTD, actief, activatieknopIndrukken, inactief, action1);
		addTransition_STD(cruiseSTD, actief, pedaalIndrukken, inactief, action2);
		addTransition_STD(cruiseSTD, pauze, pauzeknopIndrukken, actief, action3);
		addTransition_STD(cruiseSTD, actief, pauzeknopIndrukken, pauze, action4);
		addTransition_STD(cruiseSTD, actief, snelheidverhogen, actief, action5);
		addTransition_STD(cruiseSTD, actief, snelheidverlagen, actief, action6);	
		addTransition_STD(cruiseSTD, actief, snelheidaanpassen, actief, action7);

		status = inactief; //bij systeem start is de status van de cruise control inactief
	}
}

void CheckMailbox()
{
	SensorDataOut out;
	get_mailBox(&SensorInput, &out);
	actionType a;
	status = (cruiseStatus)lookUp_STD(cruiseSTD,status,out.Actie,&a);
	a(&(out.snelheid));
}

//De taak die alles start en voorziet van de juiste data
unsigned __stdcall Initialiseer(void* arg){
	task *t = (task*)arg;
	SensorData *sensordata = (SensorData *)malloc(sizeof(SensorData));	//maak sensordata
	create_mailBox(&SensorInput, 1, sizeof(Input)); 
	Gegevens *g =(Gegevens *)getArgument_task(t);
	(*sensordata).input = (*g).formData;		//zet de referentie naar de input in de sensordata
	(*sensordata).output = &SensorInput;		//zet de referentie naar de interne mailbox in de sensordata
	
	STDinit();

	quit = (*g).quit;		//dit laten we even hangen

	task *sensor = (task*)malloc(sizeof(task));
	create_task(sensor,InitSensoren,sensordata,sizeof(SensorData),0);

//	Sleep(1000);
	set_event((*g).initklaar);

	while(!isTerminated_task(t))
	{
		CheckMailbox();		
	}
	free(sensordata);
	delete(sensor);
	return 0;
}
